home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / gui4cli / ext / lvformat / agclean.h next >
Text File  |  1999-05-14  |  4KB  |  165 lines

  1.  
  2. // ==============================================================
  3. // Clean up a listview from amiga guide nodes stuff 
  4. // - return success
  5. // gcm   = pointer to the GCmain structure
  6. // ==============================================================
  7.  
  8. agclean (struct GCmain *gcm,
  9.      struct ExecBase *SysBase, struct DosLibrary *DOSBase)
  10. {
  11.     LONG   totlen, bfsize;
  12.     struct fulist *fls;
  13.     struct lister *fl, *nextfl;
  14.     UBYTE  *buff, *bf, *p, *link, *endlink, *bfend;
  15.     
  16.     // get pointer to current listview
  17.     if (!(fls = gcm->curlv) || !fls->ls) return (0);
  18.  
  19.     // get one of Gui4Cli's temporary buffers to work with
  20.     bf = gcm->membuff[0];
  21.     bfsize = gcm->buffsize; // buffer size
  22.     bfend = &bf[bfsize-5];  // safe end of available buffer 
  23.         
  24.     // do the whole list..
  25.     fl = (struct lister *)(fls->ls->lh_Head);
  26.     while (nextfl = (struct lister *)(fl->node.ln_Succ))
  27.     {
  28.        p = fl->start;
  29.        while (*p && (bf < bfend))
  30.        {
  31.             // if it's a link copy out the title..
  32.             if ((*p == '@') && (p[1] == '{'))
  33.             {  p = &p[2];
  34.                if (link = getlink(p, &endlink))
  35.                {  while ((link < endlink) && (bf < bfend))
  36.                     {  *bf = *link;
  37.                         ++bf; ++link;
  38.                     }    
  39.                     p = endlink;
  40.                }
  41.                // skip rest of link
  42.                while (*p && (*p!='}')) ++p;
  43.                ++p;
  44.             }
  45.             else
  46.             {  *bf = *p;
  47.                ++bf; ++p;
  48.             }
  49.        }
  50.        *bf = '\0';    // null end..
  51.        totlen = bf - gcm->membuff[0]; // length of new buffer
  52.        bf = gcm->membuff[0]; // point to start again
  53.  
  54.        // get the buffer we need.. (NOTE totlen + 1 - always!)
  55.        if (!(buff = (UBYTE *)AllocMem(totlen + 1, MEMF_CLEAR)))
  56.        {    PutStr ("No memory!\n");
  57.            return (0);
  58.        }
  59.        strcpy (buff, bf);
  60.     
  61.        // replace old line
  62.        FreeMem (fl->start, fl->length + 1); // note +1
  63.        fl->start  = buff;   
  64.        fl->length = totlen;
  65.     
  66.        // store max line length
  67.        if (fls->maxlength < fl->length) fls->maxlength = fl->length;
  68.  
  69.        // do next line..
  70.        fl = nextfl;
  71.     }
  72.     
  73.     return (1); // ok..
  74. }
  75.  
  76. // ==================================================================
  77. //    scan a @{...} 
  78. //    - if it's a link, return ptr to start of title, storing end
  79. //      in **end - if not, return null.
  80. // ==================================================================
  81.  
  82. UBYTE *getlink (UBYTE *buff, UBYTE **end)
  83. {
  84. UBYTE *start, *link, *endlink, *nextpos;
  85.  
  86. if ((start = nextword (buff, end)) && *end)
  87. {
  88.    nextpos = *end;
  89.    // if we stopped at a quote, advance..
  90.    if ((*nextpos == '\'') || (*nextpos = '\"'))
  91.       ++nextpos;
  92.  
  93.    if ((link = nextword (nextpos, &endlink)) && endlink)
  94.    {
  95.         if ((agcomp(link, endlink, "LINK", "link")) ||
  96.             (agcomp(link, endlink, "RX", "rx")) ||
  97.             (agcomp(link, endlink, "RXS", "rxs")) ||
  98.             (agcomp(link, endlink, "SYSTEM", "system")))
  99.            // found link
  100.            return (start);
  101.    }
  102. }
  103. *end = NULL;
  104. return (NULL);
  105. }
  106.  
  107. // ==================================================================
  108. //    Break out next word.
  109. //    - return ptr to its start & store end in **next (or null both)
  110. //      note: if end is a quote ++end before repeated call
  111. // ==================================================================
  112.  
  113. UBYTE *nextword (UBYTE *p, UBYTE **next)
  114. {
  115. UBYTE *start, g;
  116.  
  117. *next = NULL; // by default
  118. while (*p && ((*p==' ') || (*p=='\t') || (*p=='\n')))
  119.    ++p;
  120. start = p;
  121.  
  122. while (*p)
  123. {  switch (*p)
  124.    {
  125.     case ' ' :    // end of word
  126.     case '\n' :
  127.     case '\t' :
  128.         *next = p;
  129.         return (start);
  130.         break;
  131.  
  132.     case '}' : // end of definition
  133.         return (start);
  134.         break;
  135.  
  136.     case '\'' :
  137.     case '\"' :
  138.         g = *p;
  139.         ++p;
  140.         start = p;
  141.         while (*p && (*p!=g)) ++p;
  142.         if (!(*p)) return (NULL);
  143.         *next = p;  // points to the quote !!
  144.         return (start);
  145.         break;
  146.    };
  147.    ++p;
  148. }
  149. // if we get here, we enqountered a null
  150. return (NULL);
  151. }
  152.  
  153. // ==================================================================
  154. //    compare from *start to *end for either *up or *dn buffers
  155. //    - return success
  156. // ==================================================================
  157.  
  158. BOOL agcomp(UBYTE *start, UBYTE *end, UBYTE *up, UBYTE *dn)
  159. {
  160. while ((start < end) && *up && ((*start == *up) || (*start == *dn)))
  161. {   ++start; ++up; ++dn;  }
  162. if ((start == end) && (!(*up))) return (1);
  163. return (0);
  164. }
  165.